
#include <stdio.h>
#include <stdlib.h>
#include "pvm.h"
#include "instructions.h"
#include "parser.h"

/**
 * Point d'entrée du programme
 * Tests des fichiers présentés :
 * - decal.procsi
 * - jump.procsi
 * - pop.procsi
 * - test.procsi
 */
int main(void) {

	printf("###### Initialisation de la machine virtuelle ######\n");

	PVM *pvm = newPVM();

	int i;

	printf("\n###### Programme de test des fonctionnalités de base : LOAD, ADD, SUB, STORE \nAvec les différents type d'adressage  ######\n");

	printf("\t -->Chargement du programme\n");

	if(load_program("examples/test.procsi", pvm))
	{
		i =1;
		do {
			printf("\nÉxécution de l'instruction n°%d\n", i);
			i++;
		} while(step(pvm));

	}


	printf("\n\nAppuyez sur une touche pour continuer.. \n");
	getchar();

	printf("\n\n###### Initialisation de la machine virtuelle ######\n");

	pvm = newPVM();

	printf("\n###### Programme de test des fonctionnalités d'utilisation de la PILE de l'émulateur PROCSI ######\n");

	printf("\t -->Chargement du programme\n");

	if(load_program("examples/pop.procsi", pvm))
	{
		i =1;
		do {
			printf("\nÉxécution de l'instruction n°%d\n", i);
			i++;
		} while(step(pvm));
	}

	printf("\n\nAppuyez sur une touche pour continuer.. \n");
	getchar();

	printf("\n\n###### Initialisation de la machine virtuelle ######\n");

	pvm = newPVM();

	printf("\n###### Programme de test des fonctionnalités de décalage binaire de l'émulateur PROCSI ######\n");

	printf("\t -->Chargement du programme\n");

	if(load_program("examples/decal.procsi", pvm))
	{
		i =1;
		do {
			printf("\nÉxécution de l'instruction n°%d\n", i);
			i++;
		} while(step(pvm));
	}

	printf("\n\nAppuyez sur une touche pour continuer.. \n");
	getchar();

	printf("\n\n###### Initialisation de la machine virtuelle ######\n");

	pvm = newPVM();

	printf("\n###### Programme de test des fonctionnalités de sauts avec étiquettes ######\n");

	printf("\t -->Chargement du programme\n");

	if(load_program("examples/jump.procsi", pvm))
	{
		i =1;
		do {
			printf("\nÉxécution de l'instruction n°%d\n", i);
			i++;
		} while(step(pvm));
	}

	printf("\n\nAppuyez sur une touche pour continuer.. \n");
	getchar();

	printf("\n\n###### Initialisation de la machine virtuelle ######\n");

	pvm = newPVM();

	printf("\n###### Programme de test des fonctionnalités des commandes logiques : AND, OR. ######\n");

	printf("\t -->Chargement du programme\n");

	if(load_program("examples/logic.procsi", pvm))
	{
		i =1;
		do {
			printf("\nÉxécution de l'instruction n°%d\n", i);
			i++;
		} while(step(pvm));
	}

	printf("\n\nAppuyez sur une touche pour continuer.. \n");
	getchar();

	printf("\n\n###### Initialisation de la machine virtuelle ######\n");

	pvm = newPVM();

	printf("\n###### Programme de test des fonctionnalités de sauts avec étiquettes ######\n");

	printf("\t -->Chargement du programme\n");

	if(load_program("examples/jump.procsi", pvm))
	{
		i =1;
		do {
			printf("\nÉxécution de l'instruction n°%d\n", i);
			i++;
		} while(step(pvm));
	}

	printf("\n\nAppuyez sur une touche pour continuer.. \n");
	getchar();

	printf("\n\n###### Initialisation de la machine virtuelle ######\n");

	pvm = newPVM();

	printf("\n###### Programme de test des fonctionnalités des commandes : CALL, RET. ######\n");

	printf("\t -->Chargement du programme\n");

	if(load_program("examples/callret.procsi", pvm))
	{
		i =1;
		do {
			printf("\nÉxécution de l'instruction n°%d\n", i);
			i++;
		} while(step(pvm));
	}

	return 0;
}
